package com.gerzel.stop.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.datepicker.client.DatePicker;
import java.util.Date;



/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class Stop_habits implements EntryPoint {
	/**
	 * The message displayed to the user when the server cannot be reached or
	 * returns an error.
	 */
	
	//Переменные, которые влияют на работу в базе данных. 
	public Date smokeDate = null;
	public Date drinkDate = null;
	
	/**
	 * Create a remote service proxy to talk to the server-side Greeting service.
	 */
	private final StopHabitsServiceAsync stopHabitsService = GWT
			.create(StopHabitsService.class);

	/**
	 * This is the entry point method.
	 */
	public void onModuleLoad() {
		final Button sendDrinkButton = new Button("Изменить");
		final Button sendSmokeButton = new Button("Изменить");
		final Label lastSmokeLabel = new Label();
		final Label lastDrinkLabel = new Label();
		final Label afterSmokeLabel = new Label();
		final Label afterDrinkLabel = new Label();
		final HTML username = new HTML();
		
		stopHabitsService.userServer(new AsyncCallback<String>() {
			public void onFailure(Throwable caught) {
				username.setHTML("-=Error=-");
			}
			
			public void onSuccess(String result) {
				username.setHTML(result);
				}			
			});
		
		stopHabitsService.stopDrinkServer(new AsyncCallback<Date>() {
			public void onFailure(Throwable caught) {
				lastDrinkLabel.setText("-=ViewError=-");
				afterDrinkLabel.setText("-=Error=-");
			}
			
			public void onSuccess(Date result) {
				if (result != null) {
					Date date = new Date();
					drinkDate = result;
					lastDrinkLabel.setText("Последний раз Вы пили " + DateTimeFormat.getFormat("dd.MM.yyyy Z").format(drinkDate));
					afterDrinkLabel.setText("С этого времени прошло " + Long.toString((date.getTime() - result.getTime()) / (24 * 3600 * 1000)) + " дней");					
				} else {
					lastDrinkLabel.setText("В базе нет информации о Вашем употреблении алкоголя!");
					afterDrinkLabel.setText("Пожалуйста, выберите дату.");
				}
			}			
			});
		
		stopHabitsService.stopSmokeServer(new AsyncCallback<Date>() {
			public void onFailure(Throwable caught) {
				lastSmokeLabel.setText("-=ViewError=-");
				afterSmokeLabel.setText("-=Error=-");
			}
			
			public void onSuccess(Date result) {
				if (result != null) {
					Date date = new Date();
					smokeDate = result;
					lastSmokeLabel.setText("Последний раз Вы курили " + DateTimeFormat.getFormat("dd.MM.yyyy Z").format(smokeDate));
					afterSmokeLabel.setText("С этого времени прошло " + Long.toString((date.getTime() - result.getTime()) / (24 * 3600 * 1000)) + " дней");					
				} else {
					lastSmokeLabel.setText("В базе нет информации о Вашем курении!");
					afterSmokeLabel.setText("Пожалуйста, выберите дату.");
				}
			}			
			});
		
		
		final DatePicker lastSmokeDateBox = new DatePicker();
		lastSmokeDateBox.setVisible(false);
		final DatePicker lastDrinkDateBox = new DatePicker();
		lastDrinkDateBox.setVisible(false);
		
		/*
		final DateBox datebox1 = new DateBox();
		datebox1.setFormat("dd.MM.yyyy");//???
		datebox1.setValue();
		*/
		
		// We can add style names to widgets
		//sendDrinkButton.addStyleName("sendButton");
		
		RootPanel.get("userContainer").add(username);
		RootPanel.get("viewLastSmokeContainer").add(lastSmokeLabel);
		RootPanel.get("viewLastSmokeContainer").add(sendSmokeButton);
		RootPanel.get("viewLastSmokeContainer").add(afterSmokeLabel);
		RootPanel.get("changeLastSmokeContainer").add(lastSmokeDateBox);
		RootPanel.get("viewLastDrinkContainer").add(lastDrinkLabel);
		RootPanel.get("viewLastDrinkContainer").add(sendDrinkButton);
		RootPanel.get("viewLastDrinkContainer").add(afterDrinkLabel);
		RootPanel.get("changeLastDrinkContainer").add(lastDrinkDateBox);

		// Create the popup dialog box
		final DialogBox dialogBox = new DialogBox();
		dialogBox.setText("Remote Procedure Call");
		dialogBox.setAnimationEnabled(true);
		final Button closeButton = new Button("Close");
		// We can set the id of a widget by accessing its Element
		closeButton.getElement().setId("closeButton");
		final Label textToServerLabel = new Label();
		final HTML serverResponseLabel = new HTML();
		VerticalPanel dialogVPanel = new VerticalPanel();
		dialogVPanel.addStyleName("dialogVPanel");
		dialogVPanel.add(new HTML("<b>Sending name to the server:</b>"));
		dialogVPanel.add(textToServerLabel);
		dialogVPanel.add(new HTML("<br><b>Server replies:</b>"));
		dialogVPanel.add(serverResponseLabel);
		dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_RIGHT);
		dialogVPanel.add(closeButton);
		dialogBox.setWidget(dialogVPanel);

		sendDrinkButton.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (lastDrinkDateBox.isVisible()) {
					lastDrinkDateBox.setVisible(false);
					sendDrinkButton.setText("Изменить");
				} else {
					lastDrinkDateBox.setVisible(true);
					sendDrinkButton.setText("Отмена");
				}				
			}
		});
		
		sendSmokeButton.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (lastSmokeDateBox.isVisible()) {
					lastSmokeDateBox.setVisible(false);
					sendSmokeButton.setText("Изменить");
				} else {
					lastSmokeDateBox.setVisible(true);
					sendSmokeButton.setText("Отмена");
				}
			}
		});
		
		lastDrinkDateBox.addValueChangeHandler(new ValueChangeHandler<Date>() {
			public void onValueChange(ValueChangeEvent<Date> event) {
				Date date = new Date();
				if (lastDrinkDateBox.getValue().before(date)) {
					drinkDate = lastDrinkDateBox.getValue();
					stopHabitsService.habitServer(drinkDate, smokeDate,
							new AsyncCallback<String>() {
						public void onFailure(Throwable caught) {
							lastDrinkLabel.setText("-=AddError=-");
							afterDrinkLabel.setText("-=Error=-");							
						}
						
						public void onSuccess(String result) {
							Date date = new Date();
							lastDrinkLabel.setText("Последний раз Вы пили " + DateTimeFormat.getFormat("dd.MM.yyyy Z").format(drinkDate));
							afterDrinkLabel.setText("С этого времени прошло " + Long.toString((date.getTime() - drinkDate.getTime()) / (24 * 3600 * 1000)) + " дней");							
						}			
						});
				} else {
					lastDrinkLabel.setText("Данная дата еще не наступила! Попробуйте еще раз.");
				}
				lastDrinkDateBox.setVisible(false);	
				sendDrinkButton.setText("Изменить");
			}
		});
		
		lastSmokeDateBox.addValueChangeHandler(new ValueChangeHandler<Date>() {
			public void onValueChange(ValueChangeEvent<Date> event) {
				Date date = new Date();
				if (lastSmokeDateBox.getValue().before(date)) {
					smokeDate = lastSmokeDateBox.getValue();
					stopHabitsService.habitServer(drinkDate, smokeDate,
							new AsyncCallback<String>() {
						public void onFailure(Throwable caught) {
							lastSmokeLabel.setText("-=AddError=-");
							afterSmokeLabel.setText("-=Error=-");							
						}
						
						public void onSuccess(String result) {
							Date date = new Date();
							lastSmokeLabel.setText("Последний раз Вы курили " + DateTimeFormat.getFormat("dd.MM.yyyy Z").format(smokeDate));
							afterSmokeLabel.setText("С этого времени прошло " + Long.toString((date.getTime() - smokeDate.getTime()) / (24 * 3600 * 1000)) + " дней");							
						}			
						});
				} else {
					lastSmokeLabel.setText("Данная дата еще не наступила! Попробуйте еще раз.");
				}
				lastSmokeDateBox.setVisible(false);	
				sendSmokeButton.setText("Изменить");
			}
		});		
	}
}